#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1,M=21;
int T,n,m,L,V,p[N],ans,maxn,dis,t[21],k,pos,cnt;
bool f0,f1=true,x[M][M],fl1,fl2,f2;
double nowv,nowdis;
struct car{
    int d,v,a;
}h[N];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(),cout.tie();
    cin>>T;
    while(T--){
        ans=maxn=0;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++){
            cin>>h[i].d>>h[i].v>>h[i].a;
            if(h[i].a) f1=false;
            if(h[i].a<=0) f2=false;
        }
        for(int i=1;i<=m;i++) cin>>p[i];
        if(n<=20&&m<=20){
            for(int i=1;i<=n;i++){
                if(!h[i].a){
                    for(int j=1;j<=m;j++){
                        if(p[j]>h[i].d){
                            if(h[i].v>V) x[i][j]=false;
                            else x[i][j]=true;
                        }
                        else x[i][j]=true;
                    }
                }
                else{
                    for(int j=1;j<=m;j++){
                        if(p[j]<h[i].d) x[i][j]=true;
                        else{
                            dis=p[j]-h[i].d;
                            nowv=sqrt(1.0*h[i].v*h[i].v+2.0*h[i].a*dis);
                            if(nowv>V*1.0) x[i][j]=false;
                            else x[i][j]=true;
                        }
                    }
                }
            }
            for(int i=1;i<=n;i++){
                f0=true;
                for(int j=1;j<=m;j++) if(!x[i][j]) f0=false;
                if(!f0) ans++;
            }
            for(int i=0;i<(1<<m);i++){
                k=i,pos=cnt=0;
                while(k){
                    t[++pos]=k&1;
                    k>>=1;
                }
                for(int i=1;i<=m;i++) if(!t[i]) cnt++;
                fl2=true;
                for(int j=1;j<=n;j++){
                    fl1=false;
                    for(int k=1;k<=m;k++) if(!x[i][j]&&t[i]) fl1=true;
                    if(!fl1) fl2=false;
                }
                if(fl2) maxn=max(maxn,cnt);
            }
            cout<<ans<<' '<<maxn<<endl;
        }
        if(f1){
            for(int i=1;i<=n;i++){
                if(h[i].v>V){
                    ans++;
                    maxn=max(maxn,h[i].d);
                }
            }
            for(int i=1;i<=m;i++){
                if(p[i]>maxn){
                   cout<<ans<<' '<<m-i+1;
                   break;
                }
            }
        }
        if(f2){
            for(int i=1;i<=n;i++){
                nowdis=1.0*(V*V-h[i].v*h[i].v)/(2.0*h[i].a);
                ans=h[i].d+floor(nowdis);
                maxn=max(maxn,ans);
            }
            for(int i=1;i<=m;i++){
                if(p[i]>maxn){
                   cout<<ans<<' '<<m-i+1;
                   break;
                }
            }
        }
    }
}
